package org.droiddraw.property;

import java.awt.Color;

import org.droiddraw.AndroidEditor;

public class ColorProperty extends StringProperty {
	Color c;
	Color defaultColor;
	
	public ColorProperty(String englishName, String attName, Color defaultValue) {
		super(englishName, attName, makeColor(defaultValue));
		this.c = defaultValue;
		this.defaultColor = defaultValue;
	}

	@Override
	protected boolean isDefaultInternal() {
		if (c == null) {
			return true;
		}
		return c.equals(defaultColor);
	}
	
	@Override
  public void setStringValue(String col) {
		if (col == null || col.length() == 0) {
			setColorValue(null);
		}
		else {
			try {
				setColorValue(parseColor(col));
				if (col.startsWith("@")) {
					super.setStringValue(col);
				}
			}
			catch (NumberFormatException ex) {
				AndroidEditor.instance().error(ex);
			}
		}
	}
	
	public static Color parseColor(String col) {
		if (col.length() == 0) {
			return null;
		}
		if (col.startsWith("@")) {
			int ix = col.indexOf("/");
			String name = col.substring(ix+1);
			if (AndroidEditor.instance().getColors() != null)
				return AndroidEditor.instance().getColors().get(name);
			else
				return null;
		}
		
		int a, r, g, b;
		switch (col.length()) {
		case 4:
			a = 255;
			r = readHex(col.substring(1,2));
			g = readHex(col.substring(2,3));
			b = readHex(col.substring(3));
			break;
		case 5:
			a = readHex(col.substring(1,2));
			r = readHex(col.substring(2,3));
			g = readHex(col.substring(3,4));
			b = readHex(col.substring(4));
			break;
		case 7:
			a = 255;
			r = readHex(col.substring(1,3));
			g = readHex(col.substring(3,5));
			b = readHex(col.substring(5));
			break;
		case 9:
			a = readHex(col.substring(1,3));
			r = readHex(col.substring(3,5));
			g = readHex(col.substring(5,7));
			b = readHex(col.substring(7));
			break;
		default:
			throw new NumberFormatException(col);
		}
		return new Color(r,g,b,a);
	}
	
	public Color getColorValue() {
		return c;
	}
	
	public void setColorValue(Color c) {
		this.c = c;
		super.setStringValue(makeColor(this.c));
	}
	
	public static final int readHex(String in) {
		return Integer.parseInt(in, 16);
	}
	
	public static final String makeColor(java.awt.Color c) {
		if (c == null)
			return "";
		return "#"+hexString(c.getAlpha())+
				hexString(c.getRed())+
				hexString(c.getGreen())+
				hexString(c.getBlue());
	}
	
	public static final String hexString(int c) {
		String res = Integer.toHexString(c);
		if (res.length() == 1) {
			res = "0"+res;
		}
		return res;
	}
}
